home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / BEERSRC.ZIP / COMPRESS.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-21  |  3.5 KB  |  193 lines

  1.  
  2. #include <io.h>
  3. #include <fcntl.h>
  4. #include <sys\stat.h>
  5. #include <alloc.h>
  6. #include <mem.h>
  7. #include <dos.h>
  8. #include <stdlib.h>
  9.  
  10.  
  11. #define selectread(plane)       outport(0x3ce, (plane << 8) | 0x04)
  12. #define selectwrite(plane)      outport(0x3c4, (plane << 8) | 0x02)
  13. #define enablewrite(color)      outport(0x3ce, color << 8); outport(0x3ce, 0x0f01)
  14. #define disablewrite()          outport(0x3ce, 1)
  15.  
  16.  
  17. #define        PLANESIZE    28000u
  18. #define     LINESIZE    80
  19. #define        LINES        350
  20.  
  21.  
  22.  
  23. unsigned char  pal[128];
  24.  
  25. void loadpic(char *filename)
  26. {
  27.    char   *dummy;
  28.    int    filvar;
  29.    int    plane, i;
  30.    unsigned scr;
  31.  
  32.    if ((dummy = malloc(LINESIZE)) == NULL) {
  33.       abort();
  34.    }
  35.  
  36.    filvar = open(filename, O_RDONLY | O_BINARY, S_IREAD);
  37.    read(filvar, pal, 104);
  38.  
  39.  
  40.    scr = 0;
  41.    for (i = 0; i < LINES; i++) {
  42.    for (plane = 1; plane <= 8; plane <<= 1) {
  43.       read(filvar, dummy, LINESIZE);
  44.       selectwrite(plane);
  45.       movedata(FP_SEG(dummy), FP_OFF(dummy), 0xa000, scr, LINESIZE);
  46.    }
  47.    scr+=80;
  48.    }
  49.    close(filvar);
  50.  
  51.    free(dummy);
  52.  
  53. }
  54.  
  55. void screenmode(int mode)
  56. {
  57.    struct REGPACK regs;
  58.  
  59.    regs.r_ax = mode;
  60.    intr(0x10, ®s);
  61.  
  62.    regs.r_ax = 0x0100;
  63.    regs.r_cx = 0x2000;
  64.    intr(0x10, ®s);
  65.  
  66. }
  67.  
  68.  
  69. int savesec(int filvar, char sec[], int secptr)
  70. {
  71.    if (secptr>=512) {
  72.       write(filvar,sec,512);
  73.       memcpy(&sec[0],&sec[512],512);
  74.       secptr -= 512;
  75.    }
  76.    return (secptr);
  77. }
  78.  
  79.  
  80. void savepic(unsigned start, char *filename)
  81. {
  82.  
  83.    int   page, filvar;
  84.    char  far *ptr;
  85.         char    sec[1024];
  86.         int     secptr, secsave;
  87.         int     count;
  88.  
  89.  
  90.         filvar = open(filename, O_CREAT|O_TRUNC|O_WRONLY|O_BINARY,S_IWRITE);
  91.         secptr = 0;
  92.         write(filvar, &pal[0x30], 48);
  93.  
  94.         for (page = 0; page<=3; page++) {
  95.            selectread(page);
  96.            ptr = MK_FP(0xa000,start);
  97.            while (FP_OFF(ptr)<PLANESIZE) {
  98.           if (*ptr == *(ptr+1)) {
  99.                      count = -1;
  100.              while (*ptr == *(ptr+1)
  101.                 && count<127 && FP_OFF(ptr)<PLANESIZE) {
  102.             ptr++;
  103.             count++;
  104.              }
  105.              sec[secptr++] = count;
  106.                      sec[secptr++] = *ptr;
  107.                      secptr = savesec(filvar,sec,secptr);
  108.                   } else {
  109.                      count = 127;
  110.                      secsave = secptr++;
  111.                      while (*ptr != *(ptr+1)
  112.                 && count<255 && FP_OFF(ptr)<PLANESIZE) {
  113.             sec[secptr++] = *(ptr++);
  114.             count++;
  115.             sec[secsave] = count;
  116.              }
  117.              secptr = savesec(filvar,sec,secptr);
  118.           }
  119.            }
  120.         }
  121.         if (secptr != 0)
  122.            write(filvar,sec,secptr);
  123.  
  124.      close(filvar);
  125.      }
  126.  
  127.  
  128.      void readpal(char *file)
  129.      {
  130.         int  filvar;
  131.  
  132.         filvar = open(file, O_RDONLY | O_BINARY, S_IREAD);
  133.    read(filvar, pal, 128);
  134.    close(filvar);
  135.  
  136. }
  137.  
  138.  
  139. void setpal(int i)
  140. {
  141.    struct REGPACK regs;
  142.  
  143.    regs.r_ax = 0x1012;
  144.    regs.r_bx = 0;
  145.    regs.r_cx = 16;
  146.    regs.r_dx = (unsigned)&pal[i];
  147.    regs.r_es = _DS;
  148.    intr(0x10, ®s);
  149.  
  150. }
  151.  
  152. void setattrib(unsigned m)
  153. {
  154.    struct REGPACK regs;
  155.  
  156.    regs.r_ax = 0x1013;
  157.    regs.r_bx = m;
  158.    intr(0x10, ®s);
  159.  
  160. }
  161.  
  162. void setmask(int m)
  163. {
  164.    struct REGPACK regs;
  165.  
  166.    regs.r_ax = 0x1018;
  167.    regs.r_bx = m;
  168.    intr(0x10, ®s);
  169.  
  170. }
  171.  
  172. void setcolor(int c, int r, int g, int b)
  173. {
  174.    outportb(0x3c8, c);
  175.    outportb(0x3c9, r);
  176.    outportb(0x3c9, g);
  177.    outportb(0x3c9, b);
  178. }
  179.  
  180. main()
  181. {
  182.    int   i;
  183.  
  184.    screenmode(0x12);
  185.    setattrib(0x100);
  186.    loadpic("screen02.lbm");
  187. //   readpal("story2.pcx");
  188.  
  189.    savepic(0, "blick.pak");
  190.    getch();
  191.  
  192. }
  193.